/**
 * Copyright (c) [2025] [何屹林]
 *
 * 保留所有权利。
 *
 * 文件名称：DFA_maker.h
 * 模块功能说明：
 * 该模块实现DFA结构体中，定义生成DFA的各种函数，并构建DFA状态转移表，在生成DFA的过程中同步NFA中的单词顺序编码。
 *
 * 华南师范大学-计算机学院-网络工程-1班
 * 作者：何屹林-20222132023
 * 完成日期：2025年7月24日
 */

#ifndef DFA_MAKER_H
#define DFA_MAKER_H

#include "utils.h"
#include "presolve.h"
#include "NFA_maker.h"

extern int DFACnt;
extern QSet<int>DFAEND;
extern QSet<int>DFANOTEND;

struct DFANode{
    int id;
    int cd;

    QString flag=" ";//DFA结点中是否包含初态或终态
    QMap<QChar,int>transfer;//转移映射表，收到一个字符之后可以去到的结点ID
    QSet<NFA*>NFANodes;//并进来的NFA结点
    DFANode():id(0){}
    DFANode(int id):id(id){}
    DFANode(const DFANode &node):id(node.id),transfer(node.transfer),NFANodes(node.NFANodes){}

    void mergeNFA(QSet<NFA*>nn)
    {
        NFANodes=nn;

        for(NFA* node:nn)
        {
            if(node->isEnd){
                //isEnd=true;
                flag="o";
                return;
            }
        }
    }

    bool operator==(const DFANode&node)
    {
        if(NFANodes.size()!=node.NFANodes.size()) return false;
        for(NFA* nn:NFANodes)
        {
            if(!node.NFANodes.contains(nn)) return false;
        }
        return true;
    }

};

extern QVector<DFANode*>nodes;
extern QHash<QSet<NFA*>,int>DFASETMAP;


#endif // DFA_MAKER_H
